package day12.dao.impl;


import day12.dao.IGoodsDao;
import day12.model.Goods;
import day12.model.GoodsData;

/**
 * 对外提供数据处理操作
 * @since 11:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IGoodsDaoImpl implements IGoodsDao {
    // 依赖于数据源,做数据处理操作
    private Goods[] GOODSData = GoodsData.GOODSArr;

    /**
     * 返回真实对象数组
     * @return com.cskaoyan.javase._1interface._4example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/06/17 11:57
     */
    @Override
    public Goods[] getAllRealGoods() {
        /*
            数据元素的过滤,过滤掉null元素,就是数组元素的删除
            需要创建新数组
            然后将老数组中的元素过滤并拷贝到新数组
          */
        int NullElementCount = 0;
        for (Goods goods : GOODSData) {
            if (goods == null) {
                NullElementCount++;
            }
        }
        // 这里count就是null元素的个数
        Goods[] result = new Goods[GOODSData.length - NullElementCount];
        // 给新数组赋值
        int newIndex = 0;
        for (Goods goods : GOODSData) {
            if (goods == null) {
                continue;
            }
            result[newIndex] = goods;
            newIndex++;
        }
        return result;
    }

    /**
     * 存在返回true,不存在返回false
     * @param id 被校验存在的id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/06/17 14:45
     */
    @Override
    public boolean judgeIdExist(int id) {
        for (Goods realGoods : getAllRealGoods()) {
            if (id == realGoods.getId()) {
                return true;
            }
        }
        // 不存在,不重复
        return false;
    }

    /**
     * 有空间能够插入成功返回true,否则数组满了插入失败,返回false
     *
     * @param goodsInsert 被插入数据源的商品对象
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/06/17 14:49
     */
    @Override
    public boolean insertGoodsIdNotDuplicated(Goods goodsInsert) {
        // 找到一个等于null的位置,将商品对象插入进去
        for (int i = 0; i < GOODSData.length; i++) {
            if (GOODSData[i] == null) {
                // 说明数组有空间进行插入,赋值,插入成功.
                GOODSData[i] = goodsInsert;
                return true;
            }
        }
        // 遍历整个数组完了都没有找到null的位置,说明数组满了
        return false;
    }
}
